/*
Language: MEL
Description: Maya Embedded Language
Author: Shuen-Huei Guan <drake.guan@gmail.com>
*/

function(hljs) {
  return {
    defaultMode: {
      keywords:
        'int float string vector matrix if else switch case default while do for in break ' +
        'continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic ' +
        'addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey ' +
        'affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve ' +
        'alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor ' +
        'animDisplay animView annotate appendStringArray applicationName applyAttrPreset ' +
        'applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx ' +
        'artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu ' +
        'artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand ' +
        'assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface ' +
        'attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu ' +
        'attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp ' +
        'attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery ' +
        'autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults ' +
        'bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership ' +
        'bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType ' +
        'boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu ' +
        'buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge ' +
        'cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch ' +
        'catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox ' +
        'character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp ' +
        'checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip ' +
        'clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore ' +
        'closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter ' +
        'cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color ' +
        'colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp ' +
        'colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem ' +
        'componentEditor compositingInterop computePolysetVolume condition cone confirmDialog ' +
        'connectAttr connectControl connectDynamic connectJoint connectionInfo constrain ' +
        'constrainValue constructionHistory container containsMultibyte contextInfo control ' +
        'convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation ' +
        'convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache ' +
        'cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel ' +
        'cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver ' +
        'cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor ' +
        'createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer ' +
        'createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse ' +
        'currentCtx currentTime currentTimeCtx currentUnit currentUnit curve curveAddPtCtx ' +
        'curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface ' +
        'curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox ' +
        'defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete ' +
        'deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes ' +
        'delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo ' +
        'dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable ' +
        'disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected ' +
        'displayColor displayCull displayLevelOfDetail displayPref displayRGBColor ' +
        'displaySmoothness displayStats displayString displaySurface distanceDimContext ' +
        'distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct ' +
        'doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator ' +
        'duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression ' +
        'dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor ' +
        'dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers ' +
        'editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor ' +
        'editorTemplate effector emit emitter enableDevice encodeString endString endsWith env ' +
        'equivalent equivalentTol erf error eval eval evalDeferred evalEcho event ' +
        'exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp ' +
        'expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof ' +
        'fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo ' +
        'filetest filletCurve filter filterCurve filterExpand filterStudioImport ' +
        'findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster ' +
        'finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar ' +
        'floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo ' +
        'fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint ' +
        'frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss ' +
        'geometryConstraint getApplicationVersionAsFloat getAttr getClassification ' +
        'getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes ' +
        'getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender ' +
        'glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl ' +
        'gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid ' +
        'gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap ' +
        'HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor ' +
        'HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached ' +
        'HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel ' +
        'headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey ' +
        'hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender ' +
        'hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox ' +
        'iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ' +
        'ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ' +
        'ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform ' +
        'insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance ' +
        'instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp ' +
        'interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf ' +
        'isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect ' +
        'itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx ' +
        'jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner ' +
        'keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx ' +
        'keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx ' +
        'keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx ' +
        'keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor ' +
        'layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList ' +
        'lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep ' +
        'listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory ' +
        'listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation ' +
        'listNodeTypes listPanelCategories listRelatives listSets listTransforms ' +
        'listUnselected listerEditor loadFluid loadNewShelf loadPlugin ' +
        'loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log ' +
        'longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive ' +
        'makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext ' +
        'manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx ' +
        'manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout ' +
        'menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp ' +
        'mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move ' +
        'moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute ' +
        'nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast ' +
        'nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint ' +
        'normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect ' +
        'nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref ' +
        'nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType ' +
        'objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface ' +
        'offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit ' +
        'orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier ' +
        'paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration ' +
        'panelHistory paramDimContext paramDimension paramLocator parent parentConstraint ' +
        'particle particleExists particleInstancer particleRenderInfo partition pasteKey ' +
        'pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture ' +
        'pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo ' +
        'pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult ' +
        'pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend ' +
        'polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal ' +
        'polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge ' +
        'polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge ' +
        'polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet ' +
        'polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet ' +
        'polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection ' +
        'polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge ' +
        'polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet ' +
        'polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix ' +
        'polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut ' +
        'polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet ' +
        'polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge ' +
        'polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex ' +
        'polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection ' +
        'polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection ' +
        'polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint ' +
        'polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate ' +
        'polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge ' +
        'polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing ' +
        'polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet ' +
        'polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace ' +
        'popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer ' +
        'projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx ' +
        'propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd ' +
        'python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection ' +
        'radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl ' +
        'readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference ' +
        'referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE ' +
        'registerPluginResource rehash reloadImage removeJoint removeMultiInstance ' +
        'removePanelCategory rename renameAttr renameSelectionList renameUI render ' +
        'renderGlobalsNode renderInfo renderLayerButton renderLayerParent ' +
        'renderLayerPostProcess renderLayerUnparent renderManip renderPartition ' +
        'renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor ' +
        'renderWindowSelectContext renderer reorder reorderDeformers requires reroot ' +
        'resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget ' +
        'reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx ' +
        'rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout ' +
        'runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage ' +
        'saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale ' +
        'scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor ' +
        'sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable ' +
        'scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt ' +
        'searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey ' +
        'selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType ' +
        'selectedNodes selectionConnection separator setAttr setAttrEnumResource ' +
        'setAttrMapping setAttrNiceNameResource setConstraintRestPosition ' +
        'setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr ' +
        'setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe ' +
        'setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag ' +
        'setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject ' +
        'setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets ' +
        'shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare ' +
        'shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField ' +
        'shortNameOf showHelp showHidden showManipCtx showSelectionInTitle ' +
        'showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface ' +
        'size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep ' +
        'snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound ' +
        'soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort ' +
        'spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString ' +
        'startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp ' +
        'stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex ' +
        'stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex ' +
        'stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString ' +
        'stringToStringArray strip stripPrefixFromName stroke subdAutoProjection ' +
        'subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV ' +
        'subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror ' +
        'subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease ' +
        'subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring ' +
        'surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton ' +
        'symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext ' +
        'texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext ' +
        'texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text ' +
        'textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList ' +
        'textToShelf textureDisplacePlane textureHairColor texturePlacementContext ' +
        'textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath ' +
        'toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower ' +
        'toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper ' +
        'trace track trackCtx transferAttributes transformCompare transformLimits translator ' +
        'trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence ' +
        'twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit ' +
        'unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink ' +
        'uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane ' +
        'viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex ' +
        'waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire ' +
        'wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform',
      illegal: '</',
      contains: [
        hljs.C_NUMBER_MODE,
        hljs.APOS_STRING_MODE,
        hljs.QUOTE_STRING_MODE,
        {
          className: 'string',
          begin: '`', end: '`',
          contains: [hljs.BACKSLASH_ESCAPE]
        },
        {
          className: 'variable',
          begin: '\\$\\d',
          relevance: 5
        },
        {
          className: 'variable',
          begin: '[\\$\\%\\@\\*](\\^\\w\\b|#\\w+|[^\\s\\w{]|{\\w+}|\\w+)'
        },
        hljs.C_LINE_COMMENT_MODE,
        hljs.C_BLOCK_COMMENT_MODE
      ]
    }
  };
}
